/**
 * @file tsk_task.h
 * @brief tskp库 - 任务调度器模块头文件
 * @details
 * 本文件声明了tskp任务调参库的任务调度器结构体、任务注册结构体及相关操作接口。
 * 支持多优先级、多任务ID的注册、注销、启停、优先级调整、任务推送与调度等功能，适合嵌入式、实时系统下的高效任务调度与参数管理。
 *
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 日期：2025-09-11
 */

#ifndef _TSK_TASK_H_
#define _TSK_TASK_H_

#include"tsk_misc.h"        //参数

#ifdef _TSK_TSKP_

#include"tsk_task_queue.h"  //任务队列
#include"tsk_bitmap.h"      //位图

typedef enum{
    TSK_TASK_INIT_ERR,          //调度器未初始化
    TSK_TASK_PRIORITY_INVALID,  //优先级无效
    TSK_TASK_ID_INVALID,        //ID无效
    TSK_TASK_ERROR,             //任务错误
    TSK_TASK_OK                 //任务成功
}tsk_task_enum_t;               //任务操作结果

typedef void (*tsk_Func)(tsk_Parsed_t* p);      //任务函数指针

typedef struct{
    tsk_Func func;  //任务
    void *param;    //固定参数
    int priority;   //优先级
    bool active;    //是否激活
}tsk_TaskRegistry;  //任务注册

typedef struct{
    tsk_Bitmap_t id_Bitmap;                            //位图
    tsk_task_Queue_t tsk_Queue[TSK_MAX_PRIORITY_LEVELS];//队列
    tsk_TaskRegistry tasks[TSK_MAX_TASKS];              //全局任务函数
    bool isInit;                                        //初始化状态
}tsk_TaskScheduler;                                     //任务调度器

void tsk_task_Init(tsk_TaskScheduler *sched);
void tsk_stop_TaskScheduler(tsk_TaskScheduler *sched);
void tsk_start_TaskScheduler(tsk_TaskScheduler *sched);
tsk_task_enum_t tsk_register_task(tsk_TaskScheduler *sched,
                                uint8_t id,
                                tsk_Func func,
                                void* param,
                                int priority);
tsk_task_enum_t tsk_close_task(tsk_TaskScheduler *sched,uint8_t id);
tsk_task_enum_t tsk_stop_task(tsk_TaskScheduler *sched,uint8_t id);
tsk_task_enum_t tsk_start_task(tsk_TaskScheduler *sched,uint8_t id);
tsk_task_enum_t tsk_task_setpriority(tsk_TaskScheduler *sched,uint8_t id,int priority);
tsk_task_enum_t tsk_Push_task(tsk_TaskScheduler *sched,tsk_Parsed_t push_parsed);
tsk_task_enum_t tsk_Run_Priority_TaskScheduler(tsk_TaskScheduler *sched,int priority);
tsk_task_enum_t tsk_Run_TaskScheduler(tsk_TaskScheduler *sched);

#endif // _TSK_TSKP_

#endif // !_TSK_TASK_H_
